-- 选择 packer来管理插件
-- packer 的安装非常简单，只需参照官网示例将其复制、粘贴到命令行中即可完成安装。
-- Unix 与 Linux 的官网示例：
-- ```
-- $ git clone --depth 1 https://github.com/wbthomason/packer.nvim\
--  ~/.local/share/nvim/site/pack/packer/start/packer.nvim
-- ```
-- Windows Powsershell 官网示例：
-- ```
-- $ git clone https://github.com/wbthomason/packer.nvim\
--  "$env:LOCALAPPDATA\nvim-data\site\pack\packer\start\packer.nvim"
-- ```

local packer = require("packer")
packer.startup(
    {
        -- 所有插件的安装都书写在 function 中
        function()
            -- 包管理器
            use {
                "wbthomason/packer.nvim"
            }

            -- 可以一次加载一个插件，跟上一个字符串
            -- use "插件地址"
            
            -- 可以一次加载多个插件，跟上一个 list
            -- use {
            --     "插件地址",
            --     "插件地址",
            --     "插件地址"
            -- }
            
            -- 对于有依赖的插件，可以使用 requires 跟上一个 list
            -- use {
            --     "插件地址",
            --     requires = {
            --          "依赖的插件地址",
            --          "依赖的插件地址",
            --          "依赖的插件地址",
            --     }
            -- }
            
            -- 可以在插件加载完成后自动运行一些代码
            -- use {
            --     "插件地址",
            --     config = function()
            --         "需要运行的代码 ..."
            --     end
            -- }
            
            -- 插件可以在固定的文件类型里生效
            -- use {
            --     "插件地址",
            --     ft = {"html", "css", "javascript"}
            -- }
            
            -- 插件可以在一些自动事件加载后生效（延迟加载）
            -- use {
            --     "插件地址",
            --     event = "事件"  -- 使用 :h event 可获取事件帮助
            -- }
            
            -- 插件可以在输入一些命令后生效（延迟加载）
            -- use {
            --     "插件地址",
            --     cmd = {"命令", "命令", "命令"}
            -- }
            
            -- 插件可以在按下某些按键后生效（延迟加载）
            -- use {
            --     "插件地址",
            --     keys = {
            --        "键位",
            --        "键位"
            --     }
            -- }
            
            -- 在插件加载后自动执行一些操作
            -- use {
            --     "插件地址",
            --     run = "命令"
            -- }

            -- 中文文档
            use {
                "yianwillis/vimcdoc",
            }
            -- 目录树
            use {
                "kyazdani42/nvim-tree.lua",
                requires = {
                    -- 依赖一个图标插件
                    "kyazdani42/nvim-web-devicons"
                },
                config = function()
                    -- 插件加载完成后自动运行 lua/v2/conf/nvim-tree.lua 文件中的代码
                    -- require("v2.conf.nvim-tree")
                    require("conf.nvim-tree")
                end
            }

            -- 优秀的暗色主题
            -- use {
            --     "catppuccin/nvim",
            --     -- 改个别名，因为它的名字是 nvim，可能会冲突
            --     as = "catppuccin",
            --     config = function()
            --         -- 插件加载完成后自动运行 lua/conf/catppuccin.lua 文件中的代码
            --         -- require("v2.conf.catppuccin")
            --         require("conf.catppuccin")
            --     end
            -- }

            use {
                "projekt0n/github-nvim-theme",
                config = function()
                    require('conf.github-nvim-theme')
                end
            }
            -- 状态栏美化
            -- 炫酷的状态栏插件
            -- use {
            --     "windwp/windline.nvim",
            --     config = function()
            --         -- 插件加载完成后自动运行 lua/conf/windline.lua 文件中的代码
            --         -- require("v2.conf.windline")
            --         -- require("conf.windline")
            --         -- require('wlsample.airline')
            --         require('wlsample.vscode')
            --     end
            -- }
            -- 状态栏
            use {
                "nvim-lualine/lualine.nvim",
                config = function()
                    require('conf.lualine')
                end
            }
            -- 为了能让状态栏显示 git 信息，所以这个插件是必须的
            use {
                "lewis6991/gitsigns.nvim",
                requires = {
                    -- 依赖于该插件（一款 Lua 开发使用的插件）
                    "nvim-lua/plenary.nvim"
                },
                config = function()
                    -- require("gitsigns").setup()
                    -- require("v2.conf.gitsigns")
                    require("conf.gitsigns")
                end
            }
            -- 支持 LSP 状态的 buffer 栏
            use {
                "akinsho/bufferline.nvim",
                requires = {
                    "famiu/bufdelete.nvim" -- 删除 buffer 时不影响现有布局
                },
                config = function()
                    require("conf.bufferline")
                end
            }
            -- -- 搜索时显示条目
            use {
                "kevinhwang91/nvim-hlslens",
                config = function()
                    require("conf.nvim-hlslens")
                end
            }
            -- 显示缩进线
            use {
                "lukas-reineke/indent-blankline.nvim",
                config = function()
                    require("conf.indent-blankline")
                end
            }
            -- 自动匹配括号 能够自动补全另一半括号
            use {
                "windwp/nvim-autopairs",
                config = function()
                    require("conf.nvim-autopairs")
                end
            }
            -- -- 快速更改单词 快速的更改一个单词为另一个单词的反意
            -- use {
            --     "AndrewRadev/switch.vim",
            --     config = function()
            --         require("conf.switch")
            --     end
            -- }
            -- -- 快速跳转
            -- use {
            --     "phaazon/hop.nvim",
            --     config = function()
            --         require("conf.hop")
            --     end
            -- }
            -- 包裹修改 快速修改外部的包裹，如将 [] 修改为 () 等
            -- 该插件源地址已经下架了，所以下面使用的是一个 fork 地址
            -- use {
            --     "ur4ltz/surround.nvim",
            --     config = function()
            --         require("conf.surround")
            --     end
            -- }
            -- 显示光标下相同词汇 如果与 LSP 搭配，还可以快速跳转到上一个或下一个词汇，但是个人没开启这个功能，因为 # 和 * 已经有这个功能了
            use {
                "RRethy/vim-illuminate",
                config = function()
                    require("conf.vim-illuminate")
                end
            }
            -- 拼写检查器
            use {
                "lewis6991/spellsitter.nvim",
                config = function()
                    require("conf.spellsitter")
                end
            }

            -- 自动恢复光标位置
            use {
                "ethanholz/nvim-lastplace",
                config = function()
                    require("conf.nvim-lastplace")
                end
            }

            -- 自动会话管理
            -- use {
            --     "rmagatti/auto-session",
            --     config = function()
            --         require("conf.auto-session")
            --     end
            -- }
            use {
                "Shatur/neovim-session-manager",
                config = function()
                    require("conf.neovim-session-manager")
                end
            }

            -- 自动切换到项目根目录
            use "airblade/vim-rooter"
 
            
            -- -- 显示滚动条
            -- use {
            --     "petertriho/nvim-scrollbar",
            --     config = function()
            --         require("conf.nvim-scrollbar")
            --     end
            -- }
            -- 显示网页色
            use {
                "norcalli/nvim-colorizer.lua",
                config = function()
                    require("conf.nvim-colorizer")
                end
            }
            -- 内置终端 让默认终端变得既好看又好用
            use {
                "akinsho/toggleterm.nvim",
                config = function()
                    require("conf.toggleterm")
                end
            }
            -- undo tree
            use {
                "mbbill/undotree",
                config = function()
                    require("conf.undotree")
                end
            }
            -- 键位绑定器
            use {
                "folke/which-key.nvim",
                config = function()
                    require("conf.which-key")
                end
            }
            --  模糊搜索文件、文字、文档等非常多的资源 
            -- 外部依赖，fd 和 repgrep , repgrep 插件
            -- 模糊查找
            use {
                "nvim-telescope/telescope.nvim",
                requires = {
                    "nvim-lua/plenary.nvim", -- Lua 开发模块
                    -- "BurntSushi/ripgrep", -- 文字查找
                    -- "sharkdp/fd", -- 文件查找
                    "nvim-telescope/telescope-fzf-native.nvim",
                    "nvim-telescope/telescope-live-grep-raw.nvim",
                    "nvim-telescope/telescope-ui-select.nvim",
                    "nvim-telescope/telescope-file-browser.nvim",
                    "nvim-telescope/telescope-project.nvim"
                },
                config = function()
                    require("conf.telescope")
                end
            }
            -- use "nvim-telescope/telescope-fzf-native.nvim",
            -- use "nvim-telescope/telescope-live-grep-raw.nvim",
            -- use "nvim-telescope/telescope-ui-select.nvim",
            use "nvim-telescope/telescope-file-browser.nvim"
            use {'nvim-telescope/telescope-fzf-native.nvim', run = 'make' }
            
            --  书签
            use {
                "tom-anders/telescope-vim-bookmarks.nvim",
                requires = {
                    "MattesGroeger/vim-bookmarks",
                    "nvim-telescope/telescope.nvim",
                },
                config = function()
                    require("conf.telescope")
                end
            }
            -- 文件管理器
            -- use {
            --     "francoiscabrol/ranger.vim",
            --     requires = {
            --         "rbgrouleff/bclose.vim",
            --     },
            -- }
            -- use "francoiscabrol/ranger.vim" 
            -- use "rbgrouleff/bclose.vim"
            
            -- 浮动ranger
            -- use { 
            --     "kevinhwang91/rnvimr",
            --     config = function()
            --         require("conf.rnvimr")
            --     end
            -- }
            -- use {
            --     "ptzz/lf.vim",
            --     requires = {
            --         "voldikss/vim-floaterm",
            --     },
            -- } 

            -- use {
            --     "lmburns/lf.nvim",
            --     requires = {
            --         "nvim-lua/plenary.nvim",
            --         "nvim-telescope/telescope.nvim",
            --     },
            --     config = function()
            --         require("conf.lf")
            --     end
            -- } 

            -- 语法高亮
            -- 依赖 
            -- ubuntu： sudo apt install build-essential
            -- archlinux： sudo pacman -S build-essential
            -- macOS： brew install build-essential
            use {
                "nvim-treesitter/nvim-treesitter",
                run = {":TSupdate"},
                requires = {
                    "p00f/nvim-ts-rainbow" -- 彩虹括号
                },
                config = function()
                    require("conf.nvim-treesitter")
                end
            }
            -- 注释
            -- 代码注释
            use {
                "numToStr/Comment.nvim",
                requires = {
                    "JoosepAlviste/nvim-ts-context-commentstring"
                },
                config = function()
                    require("conf.Comment")
                end
            }
            -- -- LSP 基础服务
            -- use {
            --     "neovim/nvim-lspconfig",
            --     config = function()
            --         require("conf.nvim-lspconfig")
            --     end
            -- }
                                                       
            -- -- 自动安装 LSP
            -- use {
            --     "williamboman/nvim-lsp-installer",
            --     config = function()
            --         require("conf.nvim-lsp-installer")
            --     end
            -- }                                          
                                                       
            -- -- LSP UI 美化
            -- use {
            --     "tami5/lspsaga.nvim",
            --     config = function()
            --         require("conf.lspsaga")
            --     end
            -- }

            -- 自动补全
            -- 自动代码补全系列插件
            use {
                "hrsh7th/nvim-cmp",  -- 代码补全核心插件，下面都是增强补全的体验插件
                requires = {
                    {"onsails/lspkind-nvim"}, -- 为补全添加类似 vscode 的图标
                    {"hrsh7th/vim-vsnip"}, -- vsnip 引擎，用于获得代码片段支持
                    {"hrsh7th/cmp-vsnip"}, -- 适用于 vsnip 的代码片段源
                    {"hrsh7th/cmp-nvim-lsp"}, -- 替换内置 omnifunc，获得更多补全
                    {"hrsh7th/cmp-path"}, -- 路径补全
                    {"hrsh7th/cmp-buffer"}, -- 缓冲区补全
                    {"hrsh7th/cmp-cmdline"}, -- 命令补全
                    {"f3fora/cmp-spell"}, -- 拼写建议
                    {"octaltree/cmp-look"}, -- 字典提示
                    {"rafamadriz/friendly-snippets"}, -- 提供多种语言的代码片段
                    {"lukas-reineke/cmp-under-comparator"}, -- 让补全结果的排序更加智能
                    {"tzachar/cmp-tabnine", run = "./install.sh"} -- tabnine 源,提供基于 AI 的智能补全
                },
                config = function()
                    require("conf.nvim-cmp")
                end
            }
            -- 快速且完全可定制的 neovim 迎宾器。
            use {
                "goolord/alpha-nvim",
                requires = {
                    -- 依赖一个图标插件
                    "kyazdani42/nvim-web-devicons"
                },
                config = function ()
                    -- 主题：vim-startify theme
                    require'alpha'.setup(require'alpha.themes.startify'.config)
                    -- 主题：dashboard theme
                    -- require'alpha'.setup(require'alpha.themes.dashboard'.config)
                    -- 自定义面板内容
                    -- require("conf.alpha-nvim")
                end
               
            }
            -- 离开插入模式自动切换输入法
            -- use "lyokha/vim-xkbswitch"  -- 在 Neovim 配置中加入下面的设置 let g:XkbSwitchEnabled = 1
            use "rlue/vim-barbaric"  -- 开箱即用

        end,
        -- 使用浮动窗口
        config = {
            display = {
                open_fn = require("packer.util").float
            }
        }
    }
)

-- 实时生效配置
vim.cmd(
    [[
  augroup packer_user_config
    autocmd!
    autocmd BufWritePost plugins.lua source <afile> | PackerCompile
  augroup end
]]
)